Isotope Dendrochronology
COURSE: DISC, LTRR, UNIVERSITY OF ARIZONA. INSTRUCTORS: P. SZEJNER & S. BELMECHERI

Instructions :

The following code and comments should further your experience of using a mechanistic model to understand the isotopic fractionation mechanisms underlying Oxygen isotope (d18O) in tree ring cellulose. This exercise will focus on the main determinants (variables and parameters) of cellulose d18O including: (1) source water isotope ratio, (2) leaf water isotopic enrichment, and (3) biochemical fractionation at the site of sucrose production and cellulose synthesis.

The exercise and the mechanistic model correspond to the process based models termed “Craig-Gordon” model [1], and the “Roden” model [2].

[1] Craig H, Gordon L (1965) Deuterium and oxygen 18 variations in the ocean and the marine atmosphere. In: Tongiorgi E (ed) Stable Isotopes in Oceanographic Studies and Paleotemperatures. Consiglio Nazionale delle ricerche Laboratorio di Geologia Nucleare. Pisa, Spoleto, Italy, pp 9–130).

[2] Roden J, Lin G, Ehleringer JR (2000) A mechanistic model for interpretation of hydrogen and oxygen isotope ratios in tree-ring cellulose. Geochim Cosmochim Acta 64:21–35. https://doi.org/10.1016/S0016-7037(99)00195-7

The stable Oxygen isotope composition of cellulose (δ18Ocell) is determined by three factors/processes:
1. The isotopic content of the source water.
2. The leaf evaporative enrichment effect.
3. The proportion of phloem sugars that exchange with source water during cellulose formation.

The signal of these three processes is integrated into the cambium during xylogenesis. The goal of this exercise is to: (1) implement a mechanistic model to account for all these factors processes and their associated fractionations, (2) to use this mechanistic model to interpret variations of cellulose d18O.

You will simulate three different isotopic ratios in tree ring cellulose for different environmental conditions. These environmental condition reflect the growing season variability of relative humidity and precipitation experienced by trees growing in the US Southwest (See Figure 1). The growing season in this region is characterized by a bimodal distribution of precipitation (Winter-snowpack and Summer-Monsoon). The relative humidity varies from dry spring to humid summer. The two periods are separated by a hyper arid period with low precipitation and extremely low relative humidity. Accordingly, the variables in the model will vary as follows:

At the end of the exercise, you will compare the simulated 18O cellulose for the 3 seasonal variations of RH (and temperature) with measurements of cellulose d18O in tree rings from a site located in the US Southwest.

Figure 1: Seasonal relative humidity in HEL-Catalina Mountains (Arizona) (Belmecheri et al. 2018 PCE). Notice the large variations of relative humidity.

PART 1: Source Water

The d18O of source water noted as Source_18O is the isotopic ratio of the water transported through the xylem up to the leaves. This water is derived from direct precipitation and soil water taken up by the roots. This process does not alter the original d18O. Thus, source water is the starting point of d18O that will be modified by the isotopic effects (fractionations) during all the steps leading to its fixation in tree ring cellulose. Having a robust estimation or measurement of source water d18O is therefore paramount.

Here, the source water is set up at a fixed value:

Source_18O <- -8 # This is the isotopic value of the source water and  will remain constant at -8 permill during this  exercise

Then, it is converted to an isotopic ratio with regard to the standard VSMOW:

rsmow <- 0.0020052 # Oxygen Isotope ratio of the STANDARD   VSMOW
Rsource= rsmow*(1+Source_18O/1000) 

PART 2: leaf water isotopic enrichment

During plant transpiration, the heavier H218O evaporates and diffuses more slowly through the stomata than does H216O, leaving leaf water enriched in 18O. At steady state and considering the leaf as a single and isotopically well-mixed water pool, the leaf water isotopic enrichment can be estimated using the Craig Gordon model as follows:

Climate Variables/Inputs

# The 3 temperature  and Relative humidity values need to be modified to reflect the seasonality described in the introduction

temperature <- c(40, 40, 40) # temperature here is in Celsius 
Relative_humidity <- c(100, 100, 100) # RH is in %

Constants

These constants will be used to estimate/calculate the various model parameters, specifically the water vapor mole fraction in the air and in the intercellular air spaces.

br <-1 # boundary layer conductance. (mol m-2 s-1), considered reasonable value between 0.02 to 3 in Roden paper boundary layer resistance.
ak <- 1.0285    # alpha_kappa, Kinetic Fractionation 
akb <- 1.0189   # alpha_kappa_beta, Kinetic Fractionation boundary layer
Stomatal_conductance <- 0.5 # stomatal conductance to water vapor
press_bar <- 77 # barometric    pressure  (mmbar)  

Model Parameters/Variables

Water Vapor (Dv)

The isotopic value of the water vapor is estimated based on source water d18O and leaf temperature, assuming equilibrium between atmospheric vapor and source water. Water vapor can be estimates as follows:

water_vapor = Source water + the equilibrium fractionation between liquid water and vapor.

The equilibrium fractionation varies as a function of temperature.

# the temperature in the equation below refers to the leaf temperature in degrees Celsius and is converted to Kelvin (273.15)
water_vapor <-Source_18O +(-1*(1.137*(1000000/((temperature+273.15)^2))-0.4156*((1000/(temperature+273.15))-2.0667))) 

Then, it is converted to an isotopic ratio with regard to the standard VSMOW:

Rwater_vapor= rsmow*(1+water_vapor/1000)
#note!  I need help on figuring out this! What is needed?

Alpha *

The equilibrium fractionation at leaf temperature is temperature dependent (see Majoube, 1971, J. Chim. Phys. 58:1423-1436)

alpha_star =exp((1.137*1000/(273.15+temperature)^2)-(0.4156/(273.15+temperature))-0.0020667)

Water vapor mole fraction in the intercellular air spaces

Here we assume that the vapor is saturated inside the leaf. We apply this formula to calculate the vapor pressure when saturated (Rh=100%) at the temperature we best estimate the plant is and call it "ei".

ei <- (101325*exp((((-0.1299*(1-(373.16/(273.15 + temperature)))-0.6445)*(1-(373.16/(273.15 + temperature)))-1.976)*(1-(373.16/(273.15 + temperature)))+13.3185)*(1-(373.16/(273.15 + temperature)))))/1000

Then leaf water vapor is converted to mole fraction as follows:

wi=ei/press_bar

Water vapor mole fraction in the air

ea <- (Relative_humidity/100)*ei

Then water vapor in the air is converted to mole fraction as follows:

wa= ea/press_bar

Total Conductance

g = 1/(1/Stomatal_conductance + 1/br) # or 1/(rs+rb)  in mol

Leaf transpiration

Transpiration will depend on water vapor mole fraction in the air, in the leaf and on total conductance as follows:

E <- (wi-wa)*g #(mol m-2 s-1) # barbour 2004

Leaf surface water vapor

ws <- ((Stomatal_conductance*wi)-E*(1-wi/2))/(Stomatal_conductance - E/2) #mole fraction Roden (2000), Ball (1987).

Vapor pressure at leaf surface

esl <- ws*press_bar #(kPa) higher pressure  than the atmosphere

Estimating Leaf water isotopic enrichment

Lets recall the estimated variables necessary to calculate leaf water

Rsource Source water
Rwater_vapor isotopic value of the water vapor
ei Water vapor pressure inside the leaf
ea Water vapor pressure of the air
esl Water vapor pressure at leaf surface

The values can be rounded as follows:

round (Rsource, digits = 4)
round(Rwater_vapor, digits = 4)
round(esl, digits = 2)
round(ea, digits=2)
round(ei, digits=2)

The leaf water enrichment can be estimated as follows:

Rleaf <- alpha_star*((ak*Rsource *
                              ((ei-esl)/ei))+
                             (akb*Rsource *(esl-ea)/ei)+
                             (Rwater_vapor*ea/ei))

The leaf water enrichment is estimated in terms of isotopic ratio (R). It should be converted to permill values as follows:

rsmow <- 0.0020052
leaf_water_18O <- ((Rleaf/rsmow)-1)*1000
round(leaf_water_18O, digits = 2)

PART 3: isotopic signal in the Cellulose

Isotopic fractionation during sugar synthesis and mixing during cellulose synthesis.

Now, after we know the water where the sugars are made and transported in the phloem, we can use the leaf water and the Source_18O to estimate the result on the cellulose, take into consideration that during cellulose synthesis, the source water will have some influence on the result, and we usually use a 42 percent exchange.

# Now   after we know the  water where the sugars are made and trasported in the floem  we can use the leaf water and the Source_18O to estimate the end result on the cellulose, take in consideration that during  cellulose sinthesisi  the source water will have some influence on the end result. and we usualy use a 42 percent exchange
# and some constants

epsilon_s <-  27 #Autotrophic fractionation Sucrose 
epsilon_c <- 27 # Autotrophic fractionation Cellulose ## 0.0084*Tmin.ts^2-0.51*Tmin.ts+ 33.172 
F_0 <- 0.42 # proportion of source water used during cellulose sinthesys

cellulose_d18O= F_0*(Source_18O + epsilon_c) + (1 - F_0) * (leaf_water_18O+ epsilon_s) 

PART 4: Comparison between modeled data and observations

Mechanistic modeling of tree‐ring cellulose δ18O and leaf water enrichment ΔL, and their sensitivities to relative humidity. (a) The Craig–Gordon model (CG) outputs are plotted from May to December, the period corresponding to cell wall thickening for all tree‐ring subdivisions. The yellow color lines correspond to the CG simulations of δ18O cellulose within the range of the proportion of exchangeable oxygen in cellulose (Pex) variability from 0.1 (thin line) to 0.7 (thick line). The gray horizontal bars correspond to the cell wall thickening (or cell‐maturation) period for each subdivision and are plotted on the mean of the δ18O measurements. The cell wall thickening phase was derived from microscopic phenological observations from Morino and Hughes (University of Arizona, unpublished observations, Table S3). The climate drivers used in the CG model to make δ18Ocel predictions were derived from PRISM data; (b) seasonal cycle of the CG mean leaf water enrichment (ΔL). The shaded gray color corresponds to the standard deviation of modelled ΔL. The dashed blue line in (a) and (b) indicates the average date of the monsoon onset; (c) modelled ΔL plotted versus relative humidity (RH) in % calculated at bimonthly resolution. The ΔL simulations were run using mean, minimum, and maximum RH. The range of RH for the hyper‐arid period of May and June are plotted in orange circles. The dark blue circles represent RH range observed for the monsoon season (July–August). The gray circles correspond to the range of RH observed from September to April (Belmecheri et al. 2018 PCE)

your estimations for the callulose oxygen Isotopes are:

round(cellulose_d18O, digits = 2)

your estimations for the leaf water oxygen Isotopes are:

round(leaf_water_18O, digits = 2)

Comparison between modeled data and observations,

Now with these values that you comared write down your observations differences and similarities between the modeled data in this excersise and the measurements shown in the figure 2 above.

How do you think this tool is useful?

What are the constrains or difficulties on implementing this model for reliable analysis?

VPD in (kPa)

vpd =ei-ea_v round(vpd, digits=4 )

LS0tCnRpdGxlOiAiTWVjaGFuaXN0aWMgbW9kZWwgb2YgdGhlIE94eWdlbiBpc290b3BlIGluIHRyZWUgcmluZyBjZWxsdWxvc2UiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KIyMjIyMgIElzb3RvcGUgRGVuZHJvY2hyb25vbG9neQojIyMjIyAgQ09VUlNFOiBESVNDLCBMVFJSLCBVTklWRVJTSVRZIE9GIEFSSVpPTkEuIElOU1RSVUNUT1JTOiBQLiBTWkVKTkVSICYgUy4gQkVMTUVDSEVSSQoKIyMjIEluc3RydWN0aW9ucyA6CgpUaGUgZm9sbG93aW5nIGNvZGUgYW5kIGNvbW1lbnRzIHNob3VsZCBmdXJ0aGVyIHlvdXIgZXhwZXJpZW5jZSBvZiB1c2luZyBhIG1lY2hhbmlzdGljIG1vZGVsIHRvIHVuZGVyc3RhbmQgdGhlIGlzb3RvcGljIGZyYWN0aW9uYXRpb24gbWVjaGFuaXNtcyB1bmRlcmx5aW5nIE94eWdlbiBpc290b3BlIChkMThPKSBpbiB0cmVlIHJpbmcgY2VsbHVsb3NlLiBUaGlzIGV4ZXJjaXNlIHdpbGwgZm9jdXMgb24gdGhlIG1haW4gZGV0ZXJtaW5hbnRzICh2YXJpYWJsZXMgYW5kIHBhcmFtZXRlcnMpIG9mIGNlbGx1bG9zZSBkMThPIGluY2x1ZGluZzogKDEpIHNvdXJjZSB3YXRlciBpc290b3BlIHJhdGlvLCAoMikgbGVhZiB3YXRlciBpc290b3BpYyBlbnJpY2htZW50LCBhbmQgKDMpIGJpb2NoZW1pY2FsIGZyYWN0aW9uYXRpb24gYXQgdGhlIHNpdGUgb2Ygc3Vjcm9zZSBwcm9kdWN0aW9uIGFuZCBjZWxsdWxvc2Ugc3ludGhlc2lzLgoKVGhlIGV4ZXJjaXNlIGFuZCB0aGUgbWVjaGFuaXN0aWMgbW9kZWwgY29ycmVzcG9uZCB0byB0aGUgcHJvY2VzcyBiYXNlZCBtb2RlbHMgdGVybWVkICJDcmFpZy1Hb3Jkb24iIG1vZGVsIFsxXSwgYW5kIHRoZSAiUm9kZW4iIG1vZGVsIFsyXS4KCgpbMV0gQ3JhaWcgSCwgR29yZG9uIEwgKDE5NjUpIERldXRlcml1bSBhbmQgb3h5Z2VuIDE4IHZhcmlhdGlvbnMgaW4gdGhlIG9jZWFuIGFuZCB0aGUgbWFyaW5lIGF0bW9zcGhlcmUuIEluOiBUb25naW9yZ2kgRSAoZWQpIFN0YWJsZSBJc290b3BlcyBpbiBPY2Vhbm9ncmFwaGljIFN0dWRpZXMgYW5kIFBhbGVvdGVtcGVyYXR1cmVzLiBDb25zaWdsaW8gTmF6aW9uYWxlIGRlbGxlIHJpY2VyY2hlIExhYm9yYXRvcmlvIGRpIEdlb2xvZ2lhIE51Y2xlYXJlLiBQaXNhLCBTcG9sZXRvLCBJdGFseSwgcHAgOeKAkzEzMCkuCgoKWzJdIFJvZGVuIEosIExpbiBHLCBFaGxlcmluZ2VyIEpSICgyMDAwKSBBIG1lY2hhbmlzdGljIG1vZGVsIGZvciBpbnRlcnByZXRhdGlvbiBvZiBoeWRyb2dlbiBhbmQgb3h5Z2VuIGlzb3RvcGUgcmF0aW9zIGluIHRyZWUtcmluZyBjZWxsdWxvc2UuIEdlb2NoaW0gQ29zbW9jaGltIEFjdGEgNjQ6MjHigJMzNS4gaHR0cHM6Ly9kb2kub3JnLzEwLjEwMTYvUzAwMTYtNzAzNyg5OSkwMDE5NS03CgoKVGhlIHN0YWJsZSBPeHlnZW4gaXNvdG9wZSBjb21wb3NpdGlvbiBvZiBjZWxsdWxvc2UgKM60MThPY2VsbCkgaXMgZGV0ZXJtaW5lZCBieSB0aHJlZSBmYWN0b3JzL3Byb2Nlc3NlczogIAoxLiBUaGUgaXNvdG9waWMgY29udGVudCBvZiB0aGUgc291cmNlIHdhdGVyLiAgCjIuIFRoZSBsZWFmIGV2YXBvcmF0aXZlIGVucmljaG1lbnQgZWZmZWN0LiAgIAozLiBUaGUgcHJvcG9ydGlvbiBvZiBwaGxvZW0gc3VnYXJzIHRoYXQgZXhjaGFuZ2Ugd2l0aCBzb3VyY2Ugd2F0ZXIgZHVyaW5nIGNlbGx1bG9zZSBmb3JtYXRpb24uICAgCgpUaGUgc2lnbmFsIG9mIHRoZXNlIHRocmVlIHByb2Nlc3NlcyBpcyBpbnRlZ3JhdGVkIGludG8gdGhlIGNhbWJpdW0gZHVyaW5nIHh5bG9nZW5lc2lzLiBUaGUgZ29hbCBvZiB0aGlzIGV4ZXJjaXNlIGlzIHRvOiAoMSkgaW1wbGVtZW50IGEgbWVjaGFuaXN0aWMgbW9kZWwgdG8gYWNjb3VudCBmb3IgYWxsIHRoZXNlIGZhY3RvcnMgcHJvY2Vzc2VzIGFuZCB0aGVpciBhc3NvY2lhdGVkIGZyYWN0aW9uYXRpb25zLCAoMikgdG8gdXNlIHRoaXMgbWVjaGFuaXN0aWMgbW9kZWwgdG8gaW50ZXJwcmV0IHZhcmlhdGlvbnMgb2YgY2VsbHVsb3NlIGQxOE8uIAoKWW91IHdpbGwgc2ltdWxhdGUgdGhyZWUgZGlmZmVyZW50IGlzb3RvcGljIHJhdGlvcyBpbiB0cmVlIHJpbmcgY2VsbHVsb3NlIGZvciBkaWZmZXJlbnQgZW52aXJvbm1lbnRhbCBjb25kaXRpb25zLiBUaGVzZSBlbnZpcm9ubWVudGFsIGNvbmRpdGlvbiByZWZsZWN0IHRoZSBncm93aW5nIHNlYXNvbiB2YXJpYWJpbGl0eSBvZiByZWxhdGl2ZSBodW1pZGl0eSBhbmQgcHJlY2lwaXRhdGlvbiBleHBlcmllbmNlZCBieSB0cmVlcyBncm93aW5nIGluIHRoZSBVUyBTb3V0aHdlc3QgKFNlZSBGaWd1cmUgMSkuIFRoZSBncm93aW5nIHNlYXNvbiBpbiB0aGlzIHJlZ2lvbiBpcyBjaGFyYWN0ZXJpemVkIGJ5IGEgYmltb2RhbCBkaXN0cmlidXRpb24gb2YgcHJlY2lwaXRhdGlvbiAoV2ludGVyLXNub3dwYWNrIGFuZCBTdW1tZXItTW9uc29vbikuIFRoZSByZWxhdGl2ZSBodW1pZGl0eSB2YXJpZXMgZnJvbSBkcnkgc3ByaW5nIHRvIGh1bWlkIHN1bW1lci4gVGhlIHR3byBwZXJpb2RzIGFyZSBzZXBhcmF0ZWQgYnkgYSBoeXBlciBhcmlkIHBlcmlvZCB3aXRoIGxvdyBwcmVjaXBpdGF0aW9uIGFuZCBleHRyZW1lbHkgbG93IHJlbGF0aXZlIGh1bWlkaXR5LiBBY2NvcmRpbmdseSwgdGhlIHZhcmlhYmxlcyBpbiB0aGUgbW9kZWwgd2lsbCB2YXJ5IGFzIGZvbGxvd3M6ICAKCiogVGhlIHJlbGF0aXZlIGh1bWlkaXR5IGZyb20gNTAlIChzcHJpbmcpIHRvIDMwJSAocHJlLXN1bW1lciBkcm91Z2h0KSB0byA2MCUgKG1vbnNvb24pLiAgCiogVGhlIG1lYW4gYWlyIHRlbXBlcmF0dXJlIHdpbGwgdmFyeSBmcm9tIDI1LCB0byAzMywgdG8gMjcgQ2Vsc2l1cy4gIAoqIFRoZSBzb3VyY2Ugd2F0ZXIgd2lsbCByZW1haW4gY29uc3RhbnQgYXQgLTggcGVybWlsbC4gICAgIAoKQXQgdGhlIGVuZCBvZiB0aGUgZXhlcmNpc2UsIHlvdSB3aWxsIGNvbXBhcmUgdGhlIHNpbXVsYXRlZCAxOE8gY2VsbHVsb3NlIGZvciB0aGUgMyBzZWFzb25hbCB2YXJpYXRpb25zIG9mIFJIIChhbmQgdGVtcGVyYXR1cmUpIHdpdGggbWVhc3VyZW1lbnRzIG9mIGNlbGx1bG9zZSBkMThPIGluIHRyZWUgcmluZ3MgZnJvbSBhIHNpdGUgbG9jYXRlZCBpbiB0aGUgVVMgU291dGh3ZXN0LgoKIVtGaWd1cmUgMTogU2Vhc29uYWwgcmVsYXRpdmUgaHVtaWRpdHkgaW4gSEVMLUNhdGFsaW5hIE1vdW50YWlucyAoQXJpem9uYSkgKEJlbG1lY2hlcmkgZXQgYWwuIDIwMTggUENFKS4gTm90aWNlIHRoZSBsYXJnZSB2YXJpYXRpb25zIG9mIHJlbGF0aXZlIGh1bWlkaXR5Ll0oZmlndXJlcy9GSUdVUkUxX1JILnBuZykKCgoqIFlvdSB3aWxsIG5lZWQgdG8gZG93bmxvYWQgdGhlIFIgcHJvamVjdCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9wYXVsc3plam5lci9ESVNDTy1Ob3RlYm9vazIuZ2l0IGFuZCBzZXQgeW91ciBvd24gd29ya2luZyBkaXJlY3RvcnkuIE9uY2UgeW91IG9wZW4gdGhlIGBgYE5vdGVib29rMi5ScHJvamBgYCBpbiBSIHN0dWRpbyB5b3UgY2FuIG9wZW4gdGhlIGBgYE5vdGVib29rMi5SbWRgYGAgZmlsZSB0byBwcm9jZWVkIHdpdGggdGhpcyBleGVyY2lzZS4KCiMjIFBBUlQgMTogU291cmNlIFdhdGVyCgpUaGUgZDE4TyBvZiBzb3VyY2Ugd2F0ZXIgbm90ZWQgIGFzIGBgYFNvdXJjZV8xOE9gYGAgaXMgdGhlIGlzb3RvcGljIHJhdGlvIG9mIHRoZSB3YXRlciB0cmFuc3BvcnRlZCB0aHJvdWdoIHRoZSB4eWxlbSB1cCB0byB0aGUgbGVhdmVzLiBUaGlzIHdhdGVyIGlzIGRlcml2ZWQgZnJvbSBkaXJlY3QgcHJlY2lwaXRhdGlvbiBhbmQgc29pbCB3YXRlciB0YWtlbiB1cCBieSB0aGUgcm9vdHMuIFRoaXMgcHJvY2VzcyBkb2VzIG5vdCBhbHRlciB0aGUgb3JpZ2luYWwgZDE4Ty4KVGh1cywgc291cmNlIHdhdGVyIGlzIHRoZSBzdGFydGluZyBwb2ludCBvZiBkMThPIHRoYXQgd2lsbCBiZSBtb2RpZmllZCBieSB0aGUgaXNvdG9waWMgZWZmZWN0cyAoZnJhY3Rpb25hdGlvbnMpIGR1cmluZyBhbGwgdGhlIHN0ZXBzIGxlYWRpbmcgdG8gaXRzIGZpeGF0aW9uIGluIHRyZWUgcmluZyBjZWxsdWxvc2UuIEhhdmluZyBhIHJvYnVzdCBlc3RpbWF0aW9uIG9yIG1lYXN1cmVtZW50IG9mIHNvdXJjZSB3YXRlciBkMThPIGlzIHRoZXJlZm9yZSBwYXJhbW91bnQuICAgIAoKSGVyZSwgdGhlIHNvdXJjZSB3YXRlciBpcyBzZXQgdXAgYXQgYSBmaXhlZCB2YWx1ZToKYGBge3J9ClNvdXJjZV8xOE8gPC0gLTggIyBUaGlzIGlzIHRoZSBpc290b3BpYyB2YWx1ZSBvZiB0aGUgc291cmNlIHdhdGVyIGFuZCAgd2lsbCByZW1haW4gY29uc3RhbnQgYXQgLTggcGVybWlsbCBkdXJpbmcgdGhpcyAgZXhlcmNpc2UKYGBgClRoZW4sIGl0IGlzIGNvbnZlcnRlZCB0byBhbiBpc290b3BpYyByYXRpbyB3aXRoIHJlZ2FyZCB0byB0aGUgc3RhbmRhcmQgVlNNT1c6ICAKYGBge3J9CnJzbW93IDwtIDAuMDAyMDA1MiAjIE94eWdlbiBJc290b3BlIHJhdGlvIG9mIHRoZSBTVEFOREFSRAlWU01PVwpSc291cmNlPSByc21vdyooMStTb3VyY2VfMThPLzEwMDApIApgYGAKCgojIyBQQVJUIDI6IGxlYWYgd2F0ZXIgaXNvdG9waWMgZW5yaWNobWVudCAgCgpEdXJpbmcgcGxhbnQgdHJhbnNwaXJhdGlvbiwgdGhlIGhlYXZpZXIgSDIxOE8gZXZhcG9yYXRlcyBhbmQgZGlmZnVzZXMgbW9yZSBzbG93bHkgdGhyb3VnaCB0aGUgc3RvbWF0YSB0aGFuIGRvZXMgSDIxNk8sIGxlYXZpbmcgbGVhZiB3YXRlciBlbnJpY2hlZCBpbiAxOE8uIEF0IHN0ZWFkeSBzdGF0ZSBhbmQgY29uc2lkZXJpbmcgdGhlIGxlYWYgYXMgYSBzaW5nbGUgYW5kIGlzb3RvcGljYWxseSB3ZWxsLW1peGVkIHdhdGVyIHBvb2wsIHRoZSBsZWFmIHdhdGVyIGlzb3RvcGljIGVucmljaG1lbnQgY2FuIGJlIGVzdGltYXRlZCB1c2luZyB0aGUgQ3JhaWcgR29yZG9uIG1vZGVsIGFzIGZvbGxvd3M6CgoKCi0gRGUgaXMgdGhlIGlzb3RvcGljIGVucmljaG1lbnQgb2YgZXZhcG9yYXRpdmUgc2l0ZSB3YXRlciAobGVhZikgYWJvdmUgdGhlIHNvdXJjZS4gIAotIEVwc2lsb25fcGx1cyBpcyB0aGUgZXF1aWxpYnJpdW0gZnJhY3Rpb25hdGlvbiBiZXR3ZWVuIGxpcXVpZCB3YXRlciBhbmQgdmFwb3IuICAKLSBFcHNpbG9uX2sgaXMgdGhlIGtpbmVjdGljIGZyYWN0aW9uYXRpb24gZm9yIGNvbWJpbmVkIGRpZmZ1c2lvbiB0aHJvdWdoIHN0b21hdGEgYW5kIHRoZSBib3VuZGFyeSBsYXllci4gIAotIER2IGlzIHRoZSBpc290b3BpYyBlbnJpY2htZW50IG9mIGF0bW9zcGhlcmljIHZhcG9yIGNvbXBhcmVkIHRvIHNvdXJjZSB3YXRlci4gIAotIHdhL3dpIGlzIHRoZSByYXRpbyBvZiB0aGUgd2F0ZXIgdmFwb3IgbW9sZSBmcmFjdGlvbiBpbiB0aGUgYWlyIHJlbGF0aXZlIHRvIHRoYXQgaW4gdGhlIGludGVyY2VsbHVsYXIgYWlyIHNwYWNlcy4gVGhpcyBpcyBhbHNvIHJlbGF0aXZlIGh1bWlkaXR5IGFzc3VtaW5nIGxlYWYgYW5kIGFpciB0ZW1wZXJhdHVyZSBhcmUgZXF1YWwuICAKCiMjIyBDbGltYXRlIFZhcmlhYmxlcy9JbnB1dHMKCmBgYHtyfQojIFRoZSAzIHRlbXBlcmF0dXJlICBhbmQgUmVsYXRpdmUgaHVtaWRpdHkgdmFsdWVzIG5lZWQgdG8gYmUgbW9kaWZpZWQgdG8gcmVmbGVjdCB0aGUgc2Vhc29uYWxpdHkgZGVzY3JpYmVkIGluIHRoZSBpbnRyb2R1Y3Rpb24KCnRlbXBlcmF0dXJlIDwtIGMoNDAsIDQwLCA0MCkgIyB0ZW1wZXJhdHVyZSBoZXJlIGlzIGluIENlbHNpdXMgClJlbGF0aXZlX2h1bWlkaXR5IDwtIGMoMTAwLCAxMDAsIDEwMCkgIyBSSCBpcyBpbiAlCgpgYGAKCiMjIyBDb25zdGFudHMKVGhlc2UgY29uc3RhbnRzIHdpbGwgYmUgdXNlZCB0byBlc3RpbWF0ZS9jYWxjdWxhdGUgdGhlIHZhcmlvdXMgbW9kZWwgcGFyYW1ldGVycywgc3BlY2lmaWNhbGx5CnRoZSB3YXRlciB2YXBvciBtb2xlIGZyYWN0aW9uIGluIHRoZSBhaXIgYW5kIGluIHRoZSBpbnRlcmNlbGx1bGFyIGFpciBzcGFjZXMuCmBgYHtyfQpiciA8LTEgIyBib3VuZGFyeSBsYXllciBjb25kdWN0YW5jZS4gKG1vbCBtLTIgcy0xKSwgY29uc2lkZXJlZCByZWFzb25hYmxlIHZhbHVlIGJldHdlZW4gMC4wMiB0byAzIGluIFJvZGVuIHBhcGVyIGJvdW5kYXJ5IGxheWVyIHJlc2lzdGFuY2UuCmFrIDwtIDEuMDI4NQkjIGFscGhhX2thcHBhLCBLaW5ldGljIEZyYWN0aW9uYXRpb24gCmFrYiA8LSAxLjAxODkJIyBhbHBoYV9rYXBwYV9iZXRhLCBLaW5ldGljIEZyYWN0aW9uYXRpb24gYm91bmRhcnkgbGF5ZXIKU3RvbWF0YWxfY29uZHVjdGFuY2UgPC0gMC41ICMgc3RvbWF0YWwgY29uZHVjdGFuY2UgdG8gd2F0ZXIgdmFwb3IKcHJlc3NfYmFyIDwtIDc3ICMgYmFyb21ldHJpYwlwcmVzc3VyZSAgKG1tYmFyKSAgCmBgYAoKIyMjIE1vZGVsIFBhcmFtZXRlcnMvVmFyaWFibGVzCiMjIyMgV2F0ZXIgVmFwb3IgKER2KQoKVGhlICBpc290b3BpYyB2YWx1ZSBvZiB0aGUgd2F0ZXIgdmFwb3IgaXMgZXN0aW1hdGVkIGJhc2VkIG9uIHNvdXJjZSB3YXRlciBkMThPIGFuZCBsZWFmIHRlbXBlcmF0dXJlLCBhc3N1bWluZyBlcXVpbGlicml1bSBiZXR3ZWVuIGF0bW9zcGhlcmljIHZhcG9yIGFuZCBzb3VyY2Ugd2F0ZXIuICBXYXRlciB2YXBvciBjYW4gYmUgZXN0aW1hdGVzIGFzIGZvbGxvd3M6ICAKCndhdGVyX3ZhcG9yID0gU291cmNlIHdhdGVyICsgdGhlIGVxdWlsaWJyaXVtIGZyYWN0aW9uYXRpb24gYmV0d2VlbiBsaXF1aWQgd2F0ZXIgYW5kIHZhcG9yLiAgCgpUaGUgZXF1aWxpYnJpdW0gZnJhY3Rpb25hdGlvbiB2YXJpZXMgYXMgYSBmdW5jdGlvbiBvZiB0ZW1wZXJhdHVyZS4gIAoKYGBge3J9CiMgdGhlIHRlbXBlcmF0dXJlIGluIHRoZSBlcXVhdGlvbiBiZWxvdyByZWZlcnMgdG8gdGhlIGxlYWYgdGVtcGVyYXR1cmUgaW4gZGVncmVlcyBDZWxzaXVzIGFuZCBpcyBjb252ZXJ0ZWQgdG8gS2VsdmluICgyNzMuMTUpCndhdGVyX3ZhcG9yIDwtU291cmNlXzE4TyArKC0xKigxLjEzNyooMTAwMDAwMC8oKHRlbXBlcmF0dXJlKzI3My4xNSleMikpLTAuNDE1NiooKDEwMDAvKHRlbXBlcmF0dXJlKzI3My4xNSkpLTIuMDY2NykpKSAKYGBgCgpUaGVuLCBpdCBpcyBjb252ZXJ0ZWQgdG8gYW4gaXNvdG9waWMgcmF0aW8gd2l0aCByZWdhcmQgdG8gdGhlIHN0YW5kYXJkIFZTTU9XOiAgCmBgYHtyfQpSd2F0ZXJfdmFwb3I9IHJzbW93KigxK3dhdGVyX3ZhcG9yLzEwMDApCiNub3RlISAgSSBuZWVkIGhlbHAgb24gZmlndXJpbmcgb3V0IHRoaXMhIFdoYXQgaXMgbmVlZGVkPwpgYGAKCiMjIyMgQWxwaGEgKgpUaGUgZXF1aWxpYnJpdW0gZnJhY3Rpb25hdGlvbiBhdCBsZWFmIHRlbXBlcmF0dXJlICBpcyB0ZW1wZXJhdHVyZSBkZXBlbmRlbnQgKHNlZSBNYWpvdWJlLCAxOTcxLCBKLiBDaGltLiBQaHlzLiA1ODoxNDIzLTE0MzYpICAKCmBgYHtyfQphbHBoYV9zdGFyID1leHAoKDEuMTM3KjEwMDAvKDI3My4xNSt0ZW1wZXJhdHVyZSleMiktKDAuNDE1Ni8oMjczLjE1K3RlbXBlcmF0dXJlKSktMC4wMDIwNjY3KQpgYGAKCiMjIyMgV2F0ZXIgdmFwb3IgbW9sZSBmcmFjdGlvbiBpbiB0aGUgaW50ZXJjZWxsdWxhciBhaXIgc3BhY2VzCkhlcmUgd2UgYXNzdW1lIHRoYXQgdGhlIHZhcG9yIGlzIHNhdHVyYXRlZCBpbnNpZGUgdGhlIGxlYWYuIFdlIGFwcGx5IHRoaXMgZm9ybXVsYSB0byBjYWxjdWxhdGUgdGhlIHZhcG9yIHByZXNzdXJlIHdoZW4gc2F0dXJhdGVkIChSaD0xMDAlKSBhdCB0aGUgdGVtcGVyYXR1cmUgd2UgYmVzdCBlc3RpbWF0ZSB0aGUgcGxhbnQgaXMgYW5kIGNhbGwgaXQgYGBgImVpImBgYC4KYGBge3J9CmVpIDwtICgxMDEzMjUqZXhwKCgoKC0wLjEyOTkqKDEtKDM3My4xNi8oMjczLjE1ICsgdGVtcGVyYXR1cmUpKSktMC42NDQ1KSooMS0oMzczLjE2LygyNzMuMTUgKyB0ZW1wZXJhdHVyZSkpKS0xLjk3NikqKDEtKDM3My4xNi8oMjczLjE1ICsgdGVtcGVyYXR1cmUpKSkrMTMuMzE4NSkqKDEtKDM3My4xNi8oMjczLjE1ICsgdGVtcGVyYXR1cmUpKSkpKS8xMDAwCmBgYAoKVGhlbiBsZWFmIHdhdGVyIHZhcG9yIGlzIGNvbnZlcnRlZCB0byBtb2xlIGZyYWN0aW9uIGFzIGZvbGxvd3M6CmBgYHtyfQp3aT1laS9wcmVzc19iYXIKYGBgCgojIyMjIFdhdGVyIHZhcG9yIG1vbGUgZnJhY3Rpb24gaW4gdGhlIGFpcgpgYGB7cn0KZWEgPC0gKFJlbGF0aXZlX2h1bWlkaXR5LzEwMCkqZWkKYGBgCgpUaGVuIHdhdGVyIHZhcG9yIGluIHRoZSBhaXIgaXMgY29udmVydGVkIHRvIG1vbGUgZnJhY3Rpb24gYXMgZm9sbG93czoKYGBge3J9CndhPSBlYS9wcmVzc19iYXIKYGBgCgojIyMjIFRvdGFsIENvbmR1Y3RhbmNlCmBgYCB7cn0KZyA9IDEvKDEvU3RvbWF0YWxfY29uZHVjdGFuY2UgKyAxL2JyKSAjIG9yIDEvKHJzK3JiKSAgaW4gbW9sCmBgYAoKIyMjIyBMZWFmIHRyYW5zcGlyYXRpb24gClRyYW5zcGlyYXRpb24gd2lsbCBkZXBlbmQgb24gd2F0ZXIgdmFwb3IgbW9sZSBmcmFjdGlvbiBpbiB0aGUgYWlyLCBpbiB0aGUgbGVhZiBhbmQgb24gdG90YWwgY29uZHVjdGFuY2UgYXMgZm9sbG93czoKYGBgIHtyfQpFIDwtICh3aS13YSkqZyAjKG1vbCBtLTIgcy0xKSAjIGJhcmJvdXIgMjAwNApgYGAKCiMjIyMgTGVhZiBzdXJmYWNlIHdhdGVyIHZhcG9yCmBgYCB7cn0Kd3MgPC0gKChTdG9tYXRhbF9jb25kdWN0YW5jZSp3aSktRSooMS13aS8yKSkvKFN0b21hdGFsX2NvbmR1Y3RhbmNlIC0gRS8yKSAjbW9sZSBmcmFjdGlvbiBSb2RlbiAoMjAwMCksIEJhbGwgKDE5ODcpLgpgYGAKCiMjIyMgVmFwb3IgcHJlc3N1cmUgYXQgbGVhZiBzdXJmYWNlIApgYGAge3J9CmVzbCA8LSB3cypwcmVzc19iYXIgIyhrUGEpIGhpZ2hlciBwcmVzc3VyZSAgdGhhbiB0aGUgYXRtb3NwaGVyZQpgYGAKCiMjIyBFc3RpbWF0aW5nIExlYWYgd2F0ZXIgaXNvdG9waWMgZW5yaWNobWVudAoKTGV0cyByZWNhbGwgdGhlIGVzdGltYXRlZCB2YXJpYWJsZXMgbmVjZXNzYXJ5IHRvIGNhbGN1bGF0ZSBsZWFmIHdhdGVyCgpgYGAgUnNvdXJjZSBgYGAgIFNvdXJjZSB3YXRlciAgCmBgYFJ3YXRlcl92YXBvcmBgYCBpc290b3BpYyB2YWx1ZSBvZiB0aGUgd2F0ZXIgdmFwb3IgICAgIApgYGBlaWBgYCBXYXRlciB2YXBvciBwcmVzc3VyZSBpbnNpZGUgdGhlIGxlYWYgICAgCmBgYGVhYGBgICBXYXRlciB2YXBvciBwcmVzc3VyZSBvZiB0aGUgYWlyICAKYGBgZXNsYGBgIFdhdGVyIHZhcG9yIHByZXNzdXJlIGF0IGxlYWYgc3VyZmFjZSAgCgoKVGhlIHZhbHVlcyBjYW4gYmUgcm91bmRlZCBhcyBmb2xsb3dzOgpgYGAge3J9CnJvdW5kIChSc291cmNlLCBkaWdpdHMgPSA0KQpyb3VuZChSd2F0ZXJfdmFwb3IsIGRpZ2l0cyA9IDQpCnJvdW5kKGVzbCwgZGlnaXRzID0gMikKcm91bmQoZWEsIGRpZ2l0cz0yKQpyb3VuZChlaSwgZGlnaXRzPTIpCmBgYAoKVGhlIGxlYWYgd2F0ZXIgZW5yaWNobWVudCBjYW4gYmUgZXN0aW1hdGVkIGFzIGZvbGxvd3M6CmBgYCB7cn0KUmxlYWYgPC0gYWxwaGFfc3RhciooKGFrKlJzb3VyY2UgKgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGVpLWVzbCkvZWkpKSsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYWtiKlJzb3VyY2UgKihlc2wtZWEpL2VpKSsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUndhdGVyX3ZhcG9yKmVhL2VpKSkKYGBgIAoKVGhlIGxlYWYgd2F0ZXIgZW5yaWNobWVudCBpcyBlc3RpbWF0ZWQgaW4gdGVybXMgb2YgaXNvdG9waWMgcmF0aW8gKFIpLiBJdCBzaG91bGQgYmUgY29udmVydGVkICB0byBwZXJtaWxsIHZhbHVlcyBhcyBmb2xsb3dzOgoKYGBgIHtyfQpyc21vdyA8LSAwLjAwMjAwNTIKbGVhZl93YXRlcl8xOE8gPC0gKChSbGVhZi9yc21vdyktMSkqMTAwMApyb3VuZChsZWFmX3dhdGVyXzE4TywgZGlnaXRzID0gMikKYGBgCgoKCgojIyBQQVJUIDM6IGlzb3RvcGljIHNpZ25hbCBpbiB0aGUgQ2VsbHVsb3NlICAKCklzb3RvcGljIGZyYWN0aW9uYXRpb24gZHVyaW5nIHN1Z2FyIHN5bnRoZXNpcyBhbmQgbWl4aW5nIGR1cmluZyBjZWxsdWxvc2Ugc3ludGhlc2lzLiAKCk5vdywgYWZ0ZXIgd2Uga25vdyB0aGUgd2F0ZXIgd2hlcmUgdGhlIHN1Z2FycyBhcmUgbWFkZSBhbmQgdHJhbnNwb3J0ZWQgaW4gdGhlIHBobG9lbSwgd2UgY2FuIHVzZSB0aGUgbGVhZiB3YXRlciBhbmQgdGhlIFNvdXJjZV8xOE8gdG8gZXN0aW1hdGUgdGhlIHJlc3VsdCBvbiB0aGUgY2VsbHVsb3NlLCB0YWtlIGludG8gY29uc2lkZXJhdGlvbiB0aGF0IGR1cmluZyBjZWxsdWxvc2Ugc3ludGhlc2lzLCB0aGUgc291cmNlIHdhdGVyIHdpbGwgaGF2ZSBzb21lIGluZmx1ZW5jZSBvbiB0aGUgcmVzdWx0LCBhbmQgd2UgdXN1YWxseSB1c2UgYSA0MiBwZXJjZW50IGV4Y2hhbmdlLgoKCmBgYHtyfQojIE5vdyAgIGFmdGVyIHdlIGtub3cgdGhlICB3YXRlciB3aGVyZSB0aGUgc3VnYXJzIGFyZSBtYWRlIGFuZCB0cmFzcG9ydGVkIGluIHRoZSBmbG9lbSAgd2UgY2FuIHVzZSB0aGUgbGVhZiB3YXRlciBhbmQgdGhlIFNvdXJjZV8xOE8gdG8gZXN0aW1hdGUgdGhlIGVuZCByZXN1bHQgb24gdGhlIGNlbGx1bG9zZSwgdGFrZSBpbiBjb25zaWRlcmF0aW9uIHRoYXQgZHVyaW5nICBjZWxsdWxvc2Ugc2ludGhlc2lzaSAgdGhlIHNvdXJjZSB3YXRlciB3aWxsIGhhdmUgc29tZSBpbmZsdWVuY2Ugb24gdGhlIGVuZCByZXN1bHQuIGFuZCB3ZSB1c3VhbHkgdXNlIGEgNDIgcGVyY2VudCBleGNoYW5nZQojIGFuZCBzb21lIGNvbnN0YW50cwoKZXBzaWxvbl9zIDwtICAyNyAjQXV0b3Ryb3BoaWMgZnJhY3Rpb25hdGlvbiBTdWNyb3NlCQplcHNpbG9uX2MgPC0gMjcJIyBBdXRvdHJvcGhpYyBmcmFjdGlvbmF0aW9uIENlbGx1bG9zZSAjIyAwLjAwODQqVG1pbi50c14yLTAuNTEqVG1pbi50cysgMzMuMTcyIApGXzAgPC0gMC40MiAjIHByb3BvcnRpb24gb2Ygc291cmNlIHdhdGVyIHVzZWQgZHVyaW5nIGNlbGx1bG9zZSBzaW50aGVzeXMKCmNlbGx1bG9zZV9kMThPPSBGXzAqKFNvdXJjZV8xOE8gKyBlcHNpbG9uX2MpICsgKDEgLSBGXzApICogKGxlYWZfd2F0ZXJfMThPKyBlcHNpbG9uX3MpIAoKYGBgCgojIyBQQVJUIDQ6IENvbXBhcmlzb24gYmV0d2VlbiBtb2RlbGVkIGRhdGEgYW5kIG9ic2VydmF0aW9ucwoKIVtNZWNoYW5pc3RpYyBtb2RlbGluZyBvZiB0cmVl4oCQcmluZyBjZWxsdWxvc2UgzrQxOE8gYW5kIGxlYWYgd2F0ZXIgZW5yaWNobWVudCDOlEwsIGFuZCB0aGVpciBzZW5zaXRpdml0aWVzIHRvIHJlbGF0aXZlIGh1bWlkaXR5LiAoYSkgVGhlIENyYWln4oCTR29yZG9uIG1vZGVsIChDRykgb3V0cHV0cyBhcmUgcGxvdHRlZCBmcm9tIE1heSB0byBEZWNlbWJlciwgdGhlIHBlcmlvZCBjb3JyZXNwb25kaW5nIHRvIGNlbGwgd2FsbCB0aGlja2VuaW5nIGZvciBhbGwgdHJlZeKAkHJpbmcgc3ViZGl2aXNpb25zLiBUaGUgeWVsbG93IGNvbG9yIGxpbmVzIGNvcnJlc3BvbmQgdG8gdGhlIENHIHNpbXVsYXRpb25zIG9mIM60MThPIGNlbGx1bG9zZSB3aXRoaW4gdGhlIHJhbmdlIG9mIHRoZSBwcm9wb3J0aW9uIG9mIGV4Y2hhbmdlYWJsZSBveHlnZW4gaW4gY2VsbHVsb3NlIChQZXgpIHZhcmlhYmlsaXR5IGZyb20gMC4xICh0aGluIGxpbmUpIHRvIDAuNyAodGhpY2sgbGluZSkuIFRoZSBncmF5IGhvcml6b250YWwgYmFycyBjb3JyZXNwb25kIHRvIHRoZSBjZWxsIHdhbGwgdGhpY2tlbmluZyAob3IgY2VsbOKAkG1hdHVyYXRpb24pIHBlcmlvZCBmb3IgZWFjaCBzdWJkaXZpc2lvbiBhbmQgYXJlIHBsb3R0ZWQgb24gdGhlIG1lYW4gb2YgdGhlIM60MThPIG1lYXN1cmVtZW50cy4gVGhlIGNlbGwgd2FsbCB0aGlja2VuaW5nIHBoYXNlIHdhcyBkZXJpdmVkIGZyb20gbWljcm9zY29waWMgcGhlbm9sb2dpY2FsIG9ic2VydmF0aW9ucyBmcm9tIE1vcmlubyBhbmQgSHVnaGVzIChVbml2ZXJzaXR5IG9mIEFyaXpvbmEsIHVucHVibGlzaGVkIG9ic2VydmF0aW9ucywgVGFibGUgUzMpLiBUaGUgY2xpbWF0ZSBkcml2ZXJzIHVzZWQgaW4gdGhlIENHIG1vZGVsIHRvIG1ha2UgzrQxOE9jZWwgcHJlZGljdGlvbnMgd2VyZSBkZXJpdmVkIGZyb20gUFJJU00gZGF0YTsgKGIpIHNlYXNvbmFsIGN5Y2xlIG9mIHRoZSBDRyBtZWFuIGxlYWYgd2F0ZXIgZW5yaWNobWVudCAozpRMKS4gVGhlIHNoYWRlZCBncmF5IGNvbG9yIGNvcnJlc3BvbmRzIHRvIHRoZSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgbW9kZWxsZWQgzpRMLiBUaGUgZGFzaGVkIGJsdWUgbGluZSBpbiAoYSkgYW5kIChiKSBpbmRpY2F0ZXMgdGhlIGF2ZXJhZ2UgZGF0ZSBvZiB0aGUgbW9uc29vbiBvbnNldDsgKGMpIG1vZGVsbGVkIM6UTCBwbG90dGVkIHZlcnN1cyByZWxhdGl2ZSBodW1pZGl0eSAoUkgpIGluICUgY2FsY3VsYXRlZCBhdCBiaW1vbnRobHkgcmVzb2x1dGlvbi4gVGhlIM6UTCBzaW11bGF0aW9ucyB3ZXJlIHJ1biB1c2luZyBtZWFuLCBtaW5pbXVtLCBhbmQgbWF4aW11bSBSSC4gVGhlIHJhbmdlIG9mIFJIIGZvciB0aGUgaHlwZXLigJBhcmlkIHBlcmlvZCBvZiBNYXkgYW5kIEp1bmUgYXJlIHBsb3R0ZWQgaW4gb3JhbmdlIGNpcmNsZXMuIFRoZSBkYXJrIGJsdWUgY2lyY2xlcyByZXByZXNlbnQgUkggcmFuZ2Ugb2JzZXJ2ZWQgZm9yIHRoZSBtb25zb29uIHNlYXNvbiAoSnVseeKAk0F1Z3VzdCkuIFRoZSBncmF5IGNpcmNsZXMgY29ycmVzcG9uZCB0byB0aGUgcmFuZ2Ugb2YgUkggb2JzZXJ2ZWQgZnJvbSBTZXB0ZW1iZXIgdG8gQXByaWwgKEJlbG1lY2hlcmkgZXQgYWwuIDIwMTggUENFKV0oZmlndXJlcy9GSUdVUkU2LnBuZykKCnlvdXIgZXN0aW1hdGlvbnMgZm9yIHRoZSBjYWxsdWxvc2Ugb3h5Z2VuIElzb3RvcGVzIGFyZToKYGBge3J9CnJvdW5kKGNlbGx1bG9zZV9kMThPLCBkaWdpdHMgPSAyKQpgYGAKeW91ciBlc3RpbWF0aW9ucyBmb3IgdGhlIGxlYWYgd2F0ZXIgb3h5Z2VuIElzb3RvcGVzIGFyZToKYGBge3J9CnJvdW5kKGxlYWZfd2F0ZXJfMThPLCBkaWdpdHMgPSAyKQpgYGAKCiMjIyAgQ29tcGFyaXNvbiBiZXR3ZWVuIG1vZGVsZWQgZGF0YSBhbmQgb2JzZXJ2YXRpb25zLCAKTm93IHdpdGggdGhlc2UgdmFsdWVzIHRoYXQgeW91IGNvbWFyZWQgIHdyaXRlIGRvd24geW91ciBvYnNlcnZhdGlvbnMgZGlmZmVyZW5jZXMgYW5kICBzaW1pbGFyaXRpZXMgYmV0d2VlbiAgdGhlIG1vZGVsZWQgZGF0YSBpbiB0aGlzIGV4Y2Vyc2lzZSBhbmQgdGhlIG1lYXN1cmVtZW50cyBzaG93biBpbiB0aGUgZmlndXJlIDIgYWJvdmUuICAKCkhvdyBkbyB5b3UgdGhpbmsgdGhpcyB0b29sIGlzIHVzZWZ1bD8KCldoYXQgYXJlIHRoZSBjb25zdHJhaW5zIG9yIGRpZmZpY3VsdGllcyBvbiBpbXBsZW1lbnRpbmcgdGhpcyBtb2RlbCBmb3IgcmVsaWFibGUgYW5hbHlzaXM/CgoKCgoKCgoKIyBWUEQgaW4gKGtQYSkKdnBkID1laS1lYV92IApyb3VuZCh2cGQsIGRpZ2l0cz00ICkKCgoKCgo=